/**
 * var
 * let
 * const
 */
/**
 * let和var的区别
 *  let具有块级作用域，var没有
 *  let没有变量提升，var有
 * let有暂时性死区，var没有
 *  let不能重复声明一个变量，var能
 */
/**
 * const  的值不能修改，就是它栈内存地址或者堆内存指针不能修改
 * const  声明的变量，必须有初始值，不然会报错
 * const  具有let的特性
 */


// 下面通过三个实例来表示三变量的区别

// 实例1
for(var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i) // 一秒后输出5次5
    }, 1000)
}
console.log(i) // 5

for(let j = 0; j < 5; j++) {
    setTimeout(function() {
        console.log(i) // 一秒后输出0,1,2,3,4
    }, 1000)
}
console.log(j) // undefined



// 实例2
function demo1() {
    console.log(a) // undefined
    var a = 1;
}
demo1()
// 上面的代码会演化成下面代码
/* function demo1() {
    var a;
    console.log(a) // undefined
    a = 1;
}
demo1() */

function demo2() {
    // console.log(a) // ReferenceError: Cannot access 'a' before initialization， ,表现出let没有变量提升
    let a = 1;
}
demo2()

// 实例三
let b = 1;
// let b = 2; // SyntaxError: Identifier 'b' has already been declared